home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / UTIL_SRC / C126.ZIP / LEX.ZIP / LEXSRT.C < prev    next >
Text File  |  1990-01-19  |  2KB  |  128 lines

  1. /* lexsrt.c
  2.  *
  3.  * Quick Sort
  4.  */
  5.  
  6. #include "lh.h"
  7.  
  8. int ( * qs__cmp )();
  9. static int size;
  10.  
  11. void qsort ( a, n, es, fc )char * a;
  12. int n ,
  13.      es;
  14. int ( * fc )();
  15. { qs__cmp = fc;
  16.   size = es;
  17.   q_sort ( a, a + n * es );
  18. }
  19.  
  20. void q_sort ( a, l )char * a,
  21.      * l;
  22. { register char * i,
  23.      * j;
  24.   register int es;
  25.   char * lp,
  26.      * hp;
  27.   int n ,
  28.      c;
  29.   es = size;
  30.   start :
  31.   if (( n = l - a ) <= es )
  32.     return;
  33.   n = es * ( n / ( 2 * es ));
  34.   hp = lp = a + n;
  35.   i = a;
  36.   j = l - es;
  37.   for (; ; )
  38.     { if ( i < lp )
  39.         { if (( c = ( * qs__cmp )( i, lp )) == 0 )
  40.             { q_exc ( i, lp -= es );
  41.               continue;
  42.             }
  43.           if ( c < 0 )
  44.             { i += es;
  45.               continue;
  46.             }
  47.         }
  48.       loop :
  49.       if ( j > hp )
  50.         { if (( c = ( * qs__cmp )( hp, j )) == 0 )
  51.             { q_exc ( hp += es, j );
  52.               goto loop ;
  53.             }
  54.           if ( c > 0 )
  55.             { if ( i == lp )
  56.                 { q_tex ( i, hp += es, j );
  57.                   i = lp += es;
  58.                   goto loop ;
  59.                 }
  60.               q_exc ( i, j );
  61.               j -= es;
  62.               i += es;
  63.               continue;
  64.             }
  65.           j -= es;
  66.           goto loop ;
  67.         }
  68.       if ( i == lp )
  69.         { if ( lp - a >= l - hp )
  70.             { q_sort ( hp + es, l );
  71.               l = lp;
  72.             }
  73.           else
  74.             {
  75.               q_sort ( a, lp );
  76.               a = hp + es;
  77.             }
  78.           goto start ;
  79.         }
  80.       q_tex ( j, lp -= es, i );
  81.       j = hp -= es;
  82.     }
  83. }
  84.  
  85. void q_exc ( i, j )char * i,
  86.      * j;
  87. { register char * ri,
  88.      * rj,
  89.      c;
  90.   int n ;
  91.   n = size;
  92.   ri = i;
  93.   rj = j;
  94.   do
  95.     {
  96.       c =* ri;
  97.       * ri ++ =* rj;
  98.       * rj ++ = c;
  99.     }
  100.   while ( -- n )
  101.     ;
  102. }
  103.  
  104. void q_tex ( i, j, k )char * i,
  105.      * j,
  106.      * k;
  107. { register char * ri,
  108.      * rj,
  109.      * rk;
  110.   int c ;
  111.   int n ;
  112.   n = size;
  113.   ri = i;
  114.   rj = j;
  115.   rk = k;
  116.   do
  117.     {
  118.       c =* ri;
  119.       * ri ++ =* rk;
  120.       * rk ++ =* rj;
  121.       * rj ++ = (char) c;
  122.     }
  123.   while ( -- n )
  124.     ;
  125. }
  126.  
  127. /* end of lexsrt.c */
  128.